iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Software Development

或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA系列 第 10

[Day10] - Box Drop Project精進計畫(2) - 建立容易辨識的Entity名

  • 分享至 

  • xImage
  •  

為了能夠建立容易辨識的Entity名字,我們在schemas.py內建立一個name_mappingdict

要建立name_mapping,需要認識兩個Enum

  • GeneralEntityNames儲存各Entity通俗的名字。
  • AutoCreatedEntityNames儲存當各Entity是由script產生,而我們又沒有指定名字的時候,需要添加的前綴字。

name_mappingkeyGeneralEntityNamesvaluevalueAutoCreatedEntityNamesvalue。透過name_mapping我們就可以藉由通俗的Entity名稱來取得相對應的前綴字。

# schemas.py
from enum import Enum


class GeneralEntityNames(str, Enum):
    PART: str = 'part'
    SET: str = 'set'
    CONTACT: str = 'contact'
    MATERIAL: str = 'material'
    PROPERTY: str = 'property'
    SECTION: str = 'section'
    CURVE: str = 'curve'


class AutoCreatedEntityNames(str, Enum):
    PART: str = 'auto_part_'
    SET: str = 'auto_set_'
    CONTACT: str = 'auto_contact_'
    MATERIAL: str = 'auto_material_'
    PROPERTY: str = 'auto_property_'
    SECTION: str = 'auto_section_'
    CURVE: str = 'auto_curve_'

    
name_mapping = dict(zip([member.value for member in GeneralEntityNames], [
    member.value for member in AutoCreatedEntityNames]))

接著,我們建立一個_get_namefunction來負責建立獨特的名字。這個function先利用name_mapping取得了各Entity的前綴字,接著再加上各Entity的建立時間及一些random的字串(備註)。如此一來,在每個Entity自動建立的時候,都可以有一個容易辨識又不會重覆的名字,例如:auto_material_20220901_15151662189319_ce0fd0。另外,如果名字內有其建立時間的話,於debug查找各Entity建立先後次序時,也會比較方便。

我們將_get_name存於name_fetchers.py,並透過它建立每一種Entity產生名字的function,如get_one_part_nameget_one_set_nameget_one_material_name等。由於我們在_get_name中使用了short circuit的技巧,所以當沒有指定名字的時候,_get_name會自動產生適合的名字;但當有指定名字的時候,則會直接回傳指定的名字,保留了命名的彈性。

# name_fetchers.py
import uuid
from datetime import datetime

from schemas import GeneralEntityNames, name_mapping


def _get_datetime():
    return datetime.now().strftime('%Y%m%d_%H%M%s')


def _get_name(general_entity_name, name=None):
    return (name or (name_mapping.get(general_entity_name) +
                     _get_datetime() +
                     '_' +
                     uuid.uuid4().hex[:6]))


def get_one_part_name(name=None):
    return _get_name(GeneralEntityNames.PART.value, name)


def get_one_set_name(name=None):
    return _get_name(GeneralEntityNames.SET.value, name)


def get_one_contact_name(name=None):
    return _get_name(GeneralEntityNames.CONTACT.value, name)


def get_one_material_name(name=None):
    return _get_name(GeneralEntityNames.MATERIAL.value, name)


def get_one_proprty_name(name=None):
    return _get_name(GeneralEntityNames.PROPERTY.value, name)


def get_one_section_name(name=None):
    return _get_name(GeneralEntityNames.SECTION.value, name)


def get_one_curve_name(name=None):
    return _get_name(GeneralEntityNames.CURVE.value, name)

備註

或許有些先進會覺得_get_datetime已經足以建立一個獨特的名字,我們一開始也是這麼想的。直到我們做到了某些project,需要由外部呼叫ANSA、平行計算、或是使用asyncio的時候,就會遇到一些問題。所以後來才決定在最後,加上一些uuid產生的字串。

Code

本日程式碼傳送門


上一篇
[Day09] - Box Drop Project精進計畫(1) - 建立Enum
下一篇
[Day11] - Box Drop Project精進計畫(3) - 建立各Entity的id系統
系列文
或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言